package com.portal.task;

import com.portal.constant.BookConst;
import com.portal.constant.RedisConst;
import com.portal.model.entity.BookType;
import com.portal.service.BookService;
import com.portal.service.BookTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;

/**
 *  更新热销榜和分类的Redis中数据
 */
@Component
@Slf4j
public class BookJobTask {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private BookService bookService;
    @Autowired
    private BookTypeService bookTypeService;

    // 使用1：了解（延迟3秒，每2秒执行一次）
    // @Scheduled(initialDelay = 3000,fixedRate = 2000)

    // 使用2：定时任务表达式，秒 分 时 日 月 周
    // 注意：日与周，需要有一个为 ?
    @Scheduled(cron = "0 1 1 21 * ?")
    public void execute() {
        log.info("定时任务更新热销榜数据：{}", LocalDateTime.now());

        //1、删除热销榜、分类查询图书的Redis数据，也就是以：book:list
        Set keys = redisTemplate.keys(RedisConst.BOOK_LIST + "*");
        redisTemplate.delete(keys);
        //2、重新查询放入Redis缓存
        bookService.findTopSales(BookConst.FIRST_PAGE,BookConst.PAGE_SIZE);

        //2、删除所有的分类数据
        redisTemplate.delete(redisTemplate.keys(RedisConst.BOOK_TYPE_LIST + "*"));
        List<BookType> typeList = bookTypeService.findAll();
        typeList.forEach(type -> {
            bookService.findByType(BookConst.FIRST_PAGE,BookConst.PAGE_SIZE,type.getId());
        });

        log.info("Redis数据同步完成！");
    }
}

















